/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Servlets;

import java.sql.Connection;
//import java.sql.Date;
import java.util.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 *
 * @author RICARDO
 */
public class InicioAction extends Action{
        
    static Connection con  = null;
    static Statement  st   = null;  
    static ResultSet  res  = null; 
    static String     sql  = null;
    private static final String DBH = "jdbc:hsqldb:mem:memoriadb";
            boolean status;
            int i;
            
	public InicioAction() {
		// TODO Auto-generated constructor stub
	}
	@Override
        public ActionForward execute (ActionMapping mapping, 
				ActionForm form, 
				HttpServletRequest request, 
				HttpServletResponse response)throws Exception{
           
        //crearemos una BD en memoria
       
        loadHSQLDB();
        connectDB();
        createStatement();
        dropTables();
        createTables();
        //restoreDB();
        
        insertData();
       //closeHSQLDB();
          
        
        if (i==0){      
              return mapping.findForward("inicio");
          }
          else{
              return mapping.findForward("falso");
          }
        } 
        
        
    public static void loadHSQLDB()
    {
        System.out.println("* Starting...");
        try
        {
            Class.forName("org.hsqldb.jdbcDriver"); //Cargar HSQLDB driver
            System.out.println("* Cargando HSQLDB driver...");
        } 
        catch(Exception e)
        {  
            System.err.println("ERROR: fallo la carga HSQLDB JDBC driver.");
            e.printStackTrace();
            return;  
        } 
    }
            public static void connectDB()
    {
        try
        {  //Conectar a la base de datos o crear si no existe
            con = DriverManager.getConnection(DBH); 
            System.out.println("* Creando conexion HSQLDB...");
        }
        catch(Exception e)
        {
            System.err.println("Error: " + e.getMessage());
            return;
        }
    }
          public static void createStatement()
    {
        try
        {
            st  = con.createStatement(); 
        }
        catch (Exception e)
        {  
            System.err.println("Error: createStatement: " + e.getMessage());   
            return;
        }
    }  
                
          
    public static void dropTables()
    {
        try 
        {   // Drop tables
            st.executeUpdate("DROP TABLE IF EXISTS stusub;DROP TABLE IF EXISTS clientes;DROP TABLE IF EXISTS subject;");
            System.out.println("* Borrando tabla si existe...");
        }
        catch (Exception e)
        {  
            System.err.println("Peligro: Boorrando tabla: " + e.getMessage());   
        }  
    }
 
    public static void createTables()
    {
        try 
        {   // Crear tablas
           sql = "CREATE TABLE clientes ( " +
                                            "idcliente        INTEGER IDENTITY PRIMARY KEY, " +
                                            "nombre       VARCHAR(25) NOT NULL, " +
                                            "apellido_1   VARCHAR(100), " +
                                            "contrasena   VARCHAR(25) NOT NULL," +
                                            "direccion    VARCHAR(100), " +
                                            "ciudad       VARCHAR(100), " +
                                            "codigopostal      VARCHAR(5), " +
                                            "email      VARCHAR(80), " +
                                            "telefono     VARCHAR(50), " +
                                            "perfil       VARCHAR(25)," +
                                            "estado       VARCHAR(25),"+
                                            "CONSTRAINT UNIQUE_CLI UNIQUE(nombre)" +
                                         ");";
            st.executeUpdate(sql);  
            System.out.println("* Creada tabla clientes ...");
            //Tabla proveedores
            sql = "CREATE TABLE proveedores ( " +
                                            "idproveedor   INTEGER IDENTITY PRIMARY KEY, " +
                                            "nombre        VARCHAR(25) NOT NULL, " +
                                            "email         VARCHAR(80) NOT NULL, " +
                                            "estado        VARCHAR(25), " +
                                            "tipo_oferta   VARCHAR(25) NOT NULL, " +
                                            "contrasena   VARCHAR(25) NOT NULL," +
                                            "CONSTRAINT UNIQUE_PROV UNIQUE(idproveedor)" +
                                         ");";  
            st.executeUpdate(sql);  
            
            System.out.println("* Creada tabla proveedores ...");
            //tabla ofertas
            sql = "CREATE TABLE ofertas ( " +
                                            "idoferta           INTEGER IDENTITY PRIMARY KEY," +
                                            "idproveedor        INTEGER NOT NULL, " +
                                            "tipooferta         VARCHAR(10) NOT NULL, " +
                                            "subtipooferta      VARCHAR(10) NOT NULL, " +
                                            "descripcion        VARCHAR(100) NOT NULL, " +
                                            "municipio          VARCHAR(25) NOT NULL, " +
                                            "fechainicio        DATE NOT NULL, " +
                                            "fechafin           DATE NOT NULL, " +
                                            "plazas             INTEGER NOT NULL, " +
                                            "precio             INTEGER NOT NULL, " +
                                            "FOREIGN KEY (idproveedor) REFERENCES proveedores(idproveedor), " +
                                            "CONSTRAINT UNIQUE_OFER UNIQUE(idoferta)" +
                                         ");";  
            st.executeUpdate(sql);  
            
            System.out.println("* Creada tabla ofertas ...");
            
            //tabla transacciones
            sql = "CREATE TABLE transacciones ( " +
                                            "idtransaccion      INTEGER IDENTITY PRIMARY KEY," +
                                            "idoferta           INTEGER NOT NULL, " +
                                            "idcliente          INTEGER NOT NULL, " +
                                            "plazascompradas    INTEGER NOT NULL, " +
                                            "valortransaccion   INTEGER NOT NULL, " +
                                            "fechatransaccion   DATE NOT NULL, " +
                                            "FOREIGN KEY (idcliente) REFERENCES clientes(idcliente), " +
                                            "FOREIGN KEY (idoferta) REFERENCES ofertas(idoferta), " +
                                            "CONSTRAINT UNIQUE_TRAN UNIQUE(idtransaccion)" +
                                         ");";  
            st.executeUpdate(sql);  
            
            System.out.println("* Creada tabla transacciones ...");
            
            //tabla devoluciones
            sql = "CREATE TABLE devoluciones ( " +
                                            "iddevolucion       INTEGER IDENTITY PRIMARY KEY," +
                                            "idtransaccion      INTEGER NOT NULL," +
                                            "cantidad           INTEGER NOT NULL, " +
                                            "fechadevolucion    DATE NOT NULL, " +
                                            "CONSTRAINT UNIQUE_DEV UNIQUE(iddevolucion)" +
                                         ");";  
            st.executeUpdate(sql);  
            
            System.out.println("* Creada tabla devoluciones ...");
            
            //tabla suscripciones
            sql = "CREATE TABLE suscripciones ( " +
                                            "idsuscripcion       INTEGER IDENTITY PRIMARY KEY," +
                                            "idcliente           INTEGER NOT NULL," +
                                            "tipooferta          VARCHAR(25) NOT NULL, " +
                                            "subtipooferta       VARCHAR(25) NOT NULL, " +
                                            "fechadesuscripcion    DATE NOT NULL, " +
                                            "FOREIGN KEY (idcliente) REFERENCES clientes(idcliente), " +
                                            "CONSTRAINT UNIQUE_SUS UNIQUE(idsuscripcion)" +
                                         ");";  
            st.executeUpdate(sql);  
            
            System.out.println("* Creada tabla suscripciones ...");
            
            //tabla tiposofertas
            sql = "CREATE TABLE tiposofertas ( " +
                                            "id                 INTEGER IDENTITY," +
                                            "tipooferta         VARCHAR(25) NOT NULL, " +
                                            "subtipooferta      VARCHAR(25) NOT NULL, " +
                                            "CONSTRAINT UNIQUE_TIP UNIQUE(id)" +
                                            ");";  
            st.executeUpdate(sql);  
            
            System.out.println("* Creada tabla tiposofertas ...");
 /*
            sql = "CREATE TABLE stusub ( " +
                                            "id             INTEGER NOT NULL PRIMARY KEY, " +
                                            "subject        INTEGER NOT NULL, " +
                                            "student       INTEGER NOT NULL, " +
                                            "FOREIGN KEY (student) REFERENCES clientes(id), " +
                                            "FOREIGN KEY (subject) REFERENCES subject(id), " +
                                            "CONSTRAINT UNIQUE_STUSUB UNIQUE(subject, student)" +
                                         ");";  
            st.executeUpdate(sql);  
            
            System.out.println("* Creada tabla cliente-subject ...");
            */
        } 
        catch (Exception e)
        {  
            System.err.println("Peligro: CREATE TABLE: " + e.getMessage()); 
           
        }
    }
 
    public static void restoreDB()
    {
        try 
        {   // Restore the database  
            st.executeUpdate("DELETE FROM stusub;DELETE FROM student;DELETE FROM subject;");
            System.out.println("* Restaurar base BD original, borrando todos los datos previos....");
        }
        catch (Exception e)
        {  
            System.err.println("Peligro: error borrando tablas: " + e.getMessage());   
        } 
    }
    
        public static void insertData()
    {
        // Insert data  
        System.out.println("Insertando datos en tablas");
        try 
        { 
      
            //Insert clientes
            st.executeUpdate("INSERT INTO clientes (nombre, apellido_1,contrasena,direccion,ciudad,codigopostal,email,telefono, estado) VALUES ('Juan', 'Garrido','1234' ,'Sol, 12', 'Sevilla', '13206', 'j.garrido@gmail.com', '609555321', 'activo')");  
            st.executeUpdate("INSERT INTO clientes (nombre, apellido_1,contrasena,direccion,ciudad,codigopostal,email,telefono, estado)VALUES ('Luis', 'Garrido','1234', 'Flor, 5', 'Melilla', '43712', 'l.garrido@gmail.com', '615827343', 'activo')");  
            st.executeUpdate("INSERT INTO clientes (nombre, apellido_1,contrasena,direccion,ciudad,codigopostal,email,telefono, estado)VALUES ('Teresa', 'Garcia','1234', 'Mata, 18', 'Madrid', '28045', 'tere.garcia@gmail.com', '678123688', 'inactivo')");
            st.executeUpdate("INSERT INTO proveedores (nombre,email,estado,tipo_oferta,contrasena) VALUES('el pais','assger@gmail.com','activo','restaurante','1234')");
            st.executeUpdate("INSERT INTO proveedores (nombre,email,estado,tipo_oferta,contrasena) VALUES('el mundo','assgemundo@gmail.com','activo','restaurante','1234')");
            st.executeUpdate("INSERT INTO proveedores (nombre,email,estado,tipo_oferta,contrasena) VALUES('el abc','assgerabc@gmail.com','activo','restaurante','1234')");
           // Date date=new Date(50000);
            //Calendar fecha = Calendar.getInstance();
            //date=fecha.getTime();
            String date=fechaActual();
            String datef=fechaFinal();
            
            int plazas=5;
            int precio=20;
            st.executeUpdate("INSERT INTO ofertas (idproveedor,tipooferta,subtipooferta,descripcion,municipio,fechainicio,fechafin,plazas,precio) VALUES('0','restaurante','restaurante','secomemuybien el pais1','paterna','"+date+"','"+ datef+"','"+plazas+"','"+precio+"')");
            st.executeUpdate("INSERT INTO ofertas (idproveedor,tipooferta,subtipooferta,descripcion,municipio,fechainicio,fechafin,plazas,precio) VALUES('0','restaurante','restaurante','secomemuybien el pais2','paterna','"+date+"','"+ datef+"','"+plazas+"','"+precio+"')");
            st.executeUpdate("INSERT INTO ofertas (idproveedor,tipooferta,subtipooferta,descripcion,municipio,fechainicio,fechafin,plazas,precio) VALUES('0','restaurante','restaurante','secomemuybien el pais3','paterna','"+date+"','"+ datef+"','"+plazas+"','"+precio+"')");
            st.executeUpdate("INSERT INTO ofertas (idproveedor,tipooferta,subtipooferta,descripcion,municipio,fechainicio,fechafin,plazas,precio) VALUES('1','restaurante','restaurante','secomemuybien el mundo1','paterna','"+date+"','"+ datef+"','"+plazas+"','"+precio+"')");
            st.executeUpdate("INSERT INTO ofertas (idproveedor,tipooferta,subtipooferta,descripcion,municipio,fechainicio,fechafin,plazas,precio) VALUES('1','restaurante','restaurante','secomemuybien el mundo2','paterna','"+date+"','"+ datef+"','"+plazas+"','"+precio+"')");
            st.executeUpdate("INSERT INTO ofertas (idproveedor,tipooferta,subtipooferta,descripcion,municipio,fechainicio,fechafin,plazas,precio) VALUES('1','restaurante','restaurante','secomemuybien el mundo3','paterna','"+date+"','"+ datef+"','"+plazas+"','"+precio+"')");
          st.executeUpdate("INSERT INTO ofertas (idproveedor,tipooferta,subtipooferta,descripcion,municipio,fechainicio,fechafin,plazas,precio) VALUES('2','restaurante','restaurante','secomemuybien el abc1','paterna','"+date+"','"+ datef+"','"+plazas+"','"+precio+"')");
            st.executeUpdate("INSERT INTO ofertas (idproveedor,tipooferta,subtipooferta,descripcion,municipio,fechainicio,fechafin,plazas,precio) VALUES('2','restaurante','restaurante','secomemuybien el abc2','paterna','"+date+"','"+ datef+"','"+plazas+"','"+precio+"')");
            st.executeUpdate("INSERT INTO ofertas (idproveedor,tipooferta,subtipooferta,descripcion,municipio,fechainicio,fechafin,plazas,precio) VALUES('2','restaurante','restaurante','secomemuybien el abc3','paterna','"+date+"','"+ datef+"','"+plazas+"','"+precio+"')");
           
            /*
            //Foreign keys stusub
            st.executeUpdate("INSERT INTO stusub VALUES ('0', '0', '0')");  
            st.executeUpdate("INSERT INTO stusub VALUES ('1', '0', '1')");  
            st.executeUpdate("INSERT INTO stusub VALUES ('2', '1', '2')");  
          */  
        }
        catch (Exception e)
        {  
            System.err.println("Warning: error on insert data: " + e.getMessage());   
            e.printStackTrace();
            return; 
        } 
    }
    
    public static void closeHSQLDB()
    {
        // Salvar datos temporales y cerrar
        try
        {
            st = con.createStatement();  
            st.executeUpdate("SHUTDOWN");  
            st.close(); 
        }
        catch(Exception e)
        {
            System.out.println("Error: salvar datos temporales" + e.getMessage());
        }
 
        try
        {
            con.close();
        }
        catch(Exception e)
        {
            System.out.println("Error: " + e.getMessage());
            e.printStackTrace();
            return; 
        }
    }
          
     private static String fechaActual(){
        Date fechaActual = new Date(); 
        SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd"); 
        String fecha = formato.format(fechaActual);

        return fecha;
}            
    private static String fechaFinal(){
        Date fechaActual = new Date(); 
        fechaActual.setDate(fechaActual.getDate()+2);
        SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd"); 
        String fecha = formato.format(fechaActual);

        return fecha;
    }    
}